home *** CD-ROM | disk | FTP | other *** search
/ Day Cry / Day Cry CD.bin / oh_towns / taropyon / silib / silib.lzh / PRG / SDKFS / FSELSORT.C < prev    next >
C/C++ Source or Header  |  1993-11-23  |  9KB  |  375 lines

  1. /*************************************************************************
  2. *    â\ü[âg
  3. *************************************************************************/
  4.  
  5. #include    <stdio.h>
  6. #include    <stdlib.h>
  7. #include    <string.h>
  8.  
  9. #include    "sdkfs.h"
  10. #include    "sdkfscf.h"
  11.  
  12. static    int        SortDir;    /* â\ü[âgò√îⁿ    */
  13.  
  14. #define    _DIRWORK    {                                                    \
  15.     if ( (*fndat1)->buf.name[0] == '.' )                                \
  16.     {    if ( (*fndat2)->buf.name[0] == '.' )                            \
  17.             return strcmp( (*fndat1)->buf.name, (*fndat2)->buf.name);    \
  18.         else                                                            \
  19.             return (-1);                                                \
  20.     } else if ( (*fndat2)->buf.name[0] == '.' )                            \
  21.         return (1);                                                        \
  22. }
  23.  
  24. #define    ISDIR(_att)        ((_att)&FSATT_DIR)
  25.  
  26. #define    _DIRTOP    {                                \
  27.     if ( ISDIR((*fndat1)->buf.attrib) )            \
  28.     {    if ( !ISDIR((*fndat2)->buf.attrib) )    \
  29.             return (-1);                        \
  30.     } else if ( ISDIR((*fndat2)->buf.attrib) )    \
  31.         return (1);                            \
  32. }
  33.  
  34. #define    _DIRLAST    {                            \
  35.     if ( ISDIR((*fndat1)->buf.attrib) )            \
  36.     {    if ( !ISDIR((*fndat2)->buf.attrib) )    \
  37.             return (1);                            \
  38.     } else if ( ISDIR((*fndat2)->buf.attrib) )    \
  39.         return (-1);                            \
  40. }
  41.  
  42. /*************************************************************************
  43. *    âtâ@âCâïû╝â\ü[âg
  44. *************************************************************************/
  45.  
  46. /* âfâBâîâNâgâèɵô¬    */
  47. static    int        cmpFunc_fnam_0( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  48. {
  49.     int        ret;
  50.  
  51.     _DIRWORK;
  52.     _DIRTOP;
  53.  
  54.     if ( (ret = strcmp( (*fndat1)->buf.name, (*fndat2)->buf.name)) != 0 )
  55.     {    if ( SortDir )
  56.             return (ret > 0 ? -1: 1);    /* ït    */
  57.         else
  58.             return (ret);
  59.     } else
  60.         return (0);
  61. }
  62.  
  63. /* âfâBâîâNâgâèûûö÷    */
  64. static    int        cmpFunc_fnam_1( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  65. {
  66.     int        ret;
  67.  
  68.     _DIRWORK;
  69.     _DIRLAST;
  70.  
  71.     if ( (ret = strcmp( (*fndat1)->buf.name, (*fndat2)->buf.name)) != 0 )
  72.     {    if ( SortDir )
  73.             return (ret > 0 ? -1: 1);    /* ït    */
  74.         else
  75.             return (ret);
  76.     } else
  77.         return (0);
  78. }
  79.  
  80. /* âfâBâîâNâgâèû│Äï    */
  81. static    int        cmpFunc_fnam_2( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  82. {
  83.     int        ret;
  84.  
  85.     _DIRWORK;
  86.  
  87.     if ( (ret = strcmp( (*fndat1)->buf.name, (*fndat2)->buf.name)) != 0 )
  88.     {    if ( SortDir )
  89.             return (ret > 0 ? -1: 1);    /* ït    */
  90.         else
  91.             return (ret);
  92.     } else
  93.         return (0);
  94. }
  95.  
  96. /*************************************************************************
  97. *    ègÆúÄqâ\ü[âg
  98. *************************************************************************/
  99.  
  100. static    CONST char    *sub_name( CONST char *filename )
  101. {
  102.     if ( ( filename = strrchr(filename,'.') ) == 0 )
  103.         return ("");
  104.     return (filename + 1);
  105. }
  106.  
  107. /* âfâBâîâNâgâèɵô¬    */
  108. static    int        cmpFunc_sub_0( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  109. {
  110.     int        ret;
  111.  
  112.     _DIRWORK;
  113.     _DIRTOP;
  114.  
  115.     if ( (ret = strcmp( sub_name((*fndat1)->buf.name), sub_name((*fndat2)->buf.name))) == 0 )
  116.     {    if ( (ret = strcmp( (*fndat1)->buf.name, (*fndat2)->buf.name)) == 0 )
  117.             return (0);
  118.     }
  119.     if ( SortDir )
  120.         return (ret > 0 ? -1: 1);
  121.     else
  122.         return (ret);
  123. }
  124. /* âfâBâîâNâgâèûûö÷    */
  125. static    int        cmpFunc_sub_1( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  126. {
  127.     int        ret;
  128.  
  129.     _DIRWORK;
  130.     _DIRLAST;
  131.  
  132.     if ( (ret = strcmp( sub_name((*fndat1)->buf.name), sub_name((*fndat2)->buf.name))) == 0 )
  133.     {    if ( (ret = strcmp( (*fndat1)->buf.name, (*fndat2)->buf.name)) == 0 )
  134.             return (0);
  135.     }
  136.     if ( SortDir )
  137.         return (ret > 0 ? -1: 1);
  138.     else
  139.         return (ret);
  140. }
  141. /* âfâBâîâNâgâèû│Äï    */
  142. static    int        cmpFunc_sub_2( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  143. {
  144.     int        ret;
  145.  
  146.     _DIRWORK;
  147.  
  148.     if ( (ret = strcmp( sub_name((*fndat1)->buf.name), sub_name((*fndat2)->buf.name))) == 0 )
  149.     {    if ( (ret = strcmp( (*fndat1)->buf.name, (*fndat2)->buf.name)) == 0 )
  150.             return (0);
  151.     }
  152.     if ( SortDir )
  153.         return (ret > 0 ? -1: 1);
  154.     else
  155.         return (ret);
  156. }
  157.  
  158. /*************************************************************************
  159. *    â^âCâÇâXâ^âôâv
  160. *************************************************************************/
  161.  
  162. /*    âfâBâîâNâgâèɵô¬    */
  163. static    int        cmpFunc_date_0( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  164. {
  165.     int        ret;
  166.  
  167.     _DIRWORK;
  168.     _DIRTOP;
  169.  
  170. #    define    VT    unsigned short int
  171.     if ( (ret = (int)((VT)(*fndat1)->buf.wr_date - (VT)(*fndat2)->buf.wr_date)) == 0 )
  172.     {    if ( (ret = (int)((VT)(*fndat1)->buf.wr_time - (VT)(*fndat2)->buf.wr_time)) == 0 )
  173.             return (0);
  174.     }
  175. #    undef    VT
  176.     if ( SortDir )
  177.         return (ret > 0 ? -1: 1);
  178.     else
  179.         return (ret);
  180. }
  181. /*    âfâBâîâNâgâèûûö÷    */
  182. static    int        cmpFunc_date_1( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  183. {
  184.     int        ret;
  185.  
  186.     _DIRWORK;
  187.     _DIRLAST;
  188.  
  189. #    define    VT    unsigned short int
  190.     if ( (ret = (int)((VT)(*fndat1)->buf.wr_date - (VT)(*fndat2)->buf.wr_date)) == 0 )
  191.     {    if ( (ret = (int)((VT)(*fndat1)->buf.wr_time - (VT)(*fndat2)->buf.wr_time)) == 0 )
  192.             return (0);
  193.     }
  194. #    undef    VT
  195.     if ( SortDir )
  196.         return (ret > 0 ? -1: 1);
  197.     else
  198.         return (ret);
  199. }
  200. /*    âfâBâîâNâgâèû│Äï    */
  201. static    int        cmpFunc_date_2( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  202. {
  203.     int        ret;
  204.  
  205.     _DIRWORK;
  206.  
  207. #    define    VT    unsigned short int
  208.     if ( (ret = (int)((VT)(*fndat1)->buf.wr_date - (VT)(*fndat2)->buf.wr_date)) == 0 )
  209.     {    if ( (ret = (int)((VT)(*fndat1)->buf.wr_time - (VT)(*fndat2)->buf.wr_time)) == 0 )
  210.             return (0);
  211.     }
  212. #    undef    VT
  213.     if ( SortDir )
  214.         return (ret > 0 ? -1: 1);
  215.     else
  216.         return (ret);
  217. }
  218.  
  219. /*************************************************************************
  220. *    âtâ@âCâïâTâCâY
  221. *************************************************************************/
  222.  
  223. /*    âfâBâîâNâgâèɵô¬    */
  224. static    int        cmpFunc_size_0( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  225. {
  226.     int        ret;
  227.  
  228.     _DIRWORK;
  229.     _DIRTOP;
  230.     if ( ISDIR((*fndat1)->buf.attrib) && ISDIR((*fndat2)->buf.attrib) )
  231.         return (0);
  232.  
  233.     if ( (ret = (int)(*fndat1)->buf.size - (int)(*fndat2)->buf.size) == 0 )
  234.         return (0);
  235.     if ( SortDir )
  236.         return (ret > 0 ? -1: 1);
  237.     else
  238.         return (ret);
  239. }
  240. /*    âfâBâîâNâgâèûûö÷    */
  241. static    int        cmpFunc_size_1( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  242. {
  243.     int        ret;
  244.  
  245.     _DIRWORK;
  246.     _DIRLAST;
  247.     if ( ISDIR((*fndat1)->buf.attrib) && ISDIR((*fndat2)->buf.attrib) )
  248.         return (0);
  249.  
  250.     if ( (ret = (int)(*fndat1)->buf.size - (int)(*fndat2)->buf.size) == 0 )
  251.         return (0);
  252.     if ( SortDir )
  253.         return (ret > 0 ? -1: 1);
  254.     else
  255.         return (ret);
  256. }
  257. /*    âfâBâîâNâgâèû│Äï    */
  258. static    int        cmpFunc_size_2( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  259. {
  260.     int        ret;
  261.  
  262.     _DIRWORK;
  263.     if ( ISDIR((*fndat1)->buf.attrib) && ISDIR((*fndat2)->buf.attrib) )
  264.         return (0);
  265.  
  266.     if ( (ret = (int)(*fndat1)->buf.size - (int)(*fndat2)->buf.size) == 0 )
  267.         return (0);
  268.     if ( SortDir )
  269.         return (ret > 0 ? -1: 1);
  270.     else
  271.         return (ret);
  272. }
  273.  
  274.  
  275. /*************************************************************************
  276. *    â\ü[âgâIât
  277. *************************************************************************/
  278.  
  279. /*    âfâBâîâNâgâèɵô¬    */
  280. static    int        cmpFunc_off_0( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  281. {
  282.     int        ret;
  283.  
  284.     _DIRWORK;
  285.     _DIRTOP;
  286.  
  287.     if ( (ret = (*fndat1)->no - (*fndat2)->no) == 0 )
  288.         return (0);
  289.     if ( SortDir )
  290.         return (ret > 0 ? -1 : 1);
  291.     else
  292.         return (ret);
  293. }
  294. /*    âfâBâîâNâgâèûûö÷    */
  295. static    int        cmpFunc_off_1( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  296. {
  297.     int        ret;
  298.  
  299.     _DIRWORK;
  300.     _DIRLAST;
  301.  
  302.     if ( (ret = (*fndat1)->no - (*fndat2)->no) == 0 )
  303.         return (0);
  304.     if ( SortDir )
  305.         return (ret > 0 ? -1 : 1);
  306.     else
  307.         return (ret);
  308. }
  309. /*    âfâBâîâNâgâèû│Äï    */
  310. static    int        cmpFunc_off_2( FNDAT_T **fndat1, FNDAT_T **fndat2 )
  311. {
  312.     int        ret;
  313.  
  314.     _DIRWORK;
  315.  
  316.     if ( (ret = (*fndat1)->no - (*fndat2)->no) == 0 )
  317.         return (0);
  318.     if ( SortDir )
  319.         return (ret > 0 ? -1 : 1);
  320.     else
  321.         return (ret);
  322. }
  323.  
  324. /*************************************************************************
  325. *    â\ü[âgâïü[â`âô
  326. *************************************************************************/
  327.  
  328. void    FileSel_sort( FILESEL_T *fs )
  329. {
  330.     int            (*func)( FNDAT_T **, FNDAT_T **);
  331.  
  332.     if ( fs->numMat == 0 || fs->fnMat == NULL )
  333.         return;
  334.     SortDir = (fs->sort & FSSORT_RVS) == 0 ? FALSE : TRUE;
  335.     switch ( fs->sort & 0x0F )
  336.     {
  337.         case FSSORT_FILE:
  338.             switch ( fs->sort & FSSORT_DIRBIT )
  339.             {    case FSSORT_DIRTOP:        func = cmpFunc_fnam_0;        break;
  340.                 case FSSORT_DIRLAST:    func = cmpFunc_fnam_1;        break;
  341.                 case FSSORT_DIROFF:        func = cmpFunc_fnam_2;        break;
  342.             }
  343.             break;
  344.         case FSSORT_SUB:
  345.             switch ( fs->sort & FSSORT_DIRBI